mod left;
mod center;
mod right;
mod bottom;
mod common;  // 引入common模块

use fltk::{
    prelude::*,
    window::Window,
    app,
    enums::Mode,
};

// use std::thread;
use std::sync::mpsc;
use center::CenterPanel;
use left::LeftPanel;
use right::RightPanel;
use bottom::BottomPanel;

fn main() {
    let app = app::App::default();

    // 设置全局字体和编码
    app::set_visual(Mode::Rgb);

    // 在 Linux/WSL 环境下使用系统字体
    #[cfg(target_os = "linux")]
    {
        // 尝试使用系统中文字体
        let fonts = fltk::app::get_font_names();
        for font in fonts {
            if font.contains("Noto Sans CJK") || font.contains("WenQuanYi") {
                app::set_font(fltk::enums::Font::by_name(&font));
                break;
            }
        }
    }
    // 在 Windows 环境下使用系统字体
    #[cfg(target_os = "windows")]
    {
        app::set_font(fltk::enums::Font::by_name("Microsoft YaHei"));
    }

    app::set_font_size(12);

    // 设置DPI感知
    app::set_screen_scale(0, 1.0);

    let (left_event_tx, event_rx) = mpsc::channel();
    // let center_event_tx = left_event_tx.clone();
    // let right_event_tx = left_event_tx.clone();
    // let bottom_event_tx = left_event_tx.clone();

    let area_width = 1500;
    let area_height = 600;
    let mut win = Window::new(0, 0, area_width, area_height, "nettools-rs").center_screen();
    win.set_color(fltk::enums::Color::from_rgb(238, 238, 238));  // 设置窗口背景颜色为灰白色

    let left_sx = 0;
    let left_sy = 0;
    let mut left_panel = LeftPanel::new(area_width, area_height, left_sx, left_sy, left_event_tx);

    let (_, _, left_ex, _) = left_panel.get_coordinates();
    let mut center_view = CenterPanel::new(area_width, area_height, left_ex, left_sy);

    let (_, center_sy, center_ex, center_ey) = center_view.get_coordinates();
    let mut right_panel = RightPanel::new(area_width, area_height, center_ex, center_sy);

    let mut bottom_panel = BottomPanel::new(area_width, area_height, left_ex, center_ey);

    win.end();
    win.show();

    // 使用 FLTK 正确的空闲回调函数 add_idle
    use std::sync::{Arc, Mutex};
    let event_rx = Arc::new(Mutex::new(event_rx));
    app::add_idle(move || {
        let mut rx = event_rx.lock().unwrap();
        // 非阻塞地接收事件
        while let Ok(event) = rx.try_recv() {
            println!("Received event: {:?}", event);
            // 处理事件
            left_panel.handle_event(&event);
            center_view.handle_event(&event);
            right_panel.handle_event(&event);
            bottom_panel.handle_event(&event);
        }
    });

    app.run().unwrap();
}